home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / tvdmx.exe / DMXGIZMA.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-07-16  |  13.8 KB  |  504 lines

  1.  
  2. {■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}
  3. {                            }
  4. {    DMXGIZMA  --constants, variables and functions    }
  5. {    tvDMX     --data editing project (ver 1.5)    }
  6. {                            }
  7. {    Copyright (c) 1992  Randolph Beck        }
  8. {                P.O. Box  56-0487        }
  9. {                Orlando, FL 32856        }
  10. {                CIS:  72361,753        }
  11. {                            }
  12. {■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}
  13.  
  14. Unit DMXGIZMA;
  15.  
  16. {$V-,X+,O+,D-,B-,R- }
  17.  
  18. interface
  19.  
  20. uses  Objects, Drivers, Views, App, RSet;
  21.  
  22. {$DEFINE tvDMX1A }
  23.  
  24. const
  25.     cmDMX               = 4400;
  26.  
  27.     cmDMX_RollCall      = cmDMX +  1;
  28.     cmDMX_Ack           = cmDMX +  2;
  29.     cmDMX_Enter         = cmDMX +  3;
  30.     cmDMX_FieldAltered  = cmDMX +  4;
  31.     cmDMX_Draw          = cmDMX +  5;
  32.     cmDMX_DrawData      = cmDMX +  6;
  33.     cmDMX_Lock          = cmDMX +  7;
  34.     cmDMX_LockData      = cmDMX +  8;
  35.     cmDMX_Unlock        = cmDMX +  9;
  36.     cmDMX_UnlockData    = cmDMX + 10;
  37.     cmDMX_FixSize       = cmDMX + 11;
  38.     cmDMX_ZeroizeRec    = cmDMX + 12;
  39.     cmDMX_WrongKey    = cmDMX + 13;
  40.  
  41.     cmDMX_Left          = cmDMX + 15;
  42.     cmDMX_Right         = cmDMX + 16;
  43.  
  44.     cmDMX_Home          = cmDMX + 18;
  45.     cmDMX_End           = cmDMX + 19;
  46.  
  47.     cmDMX_goto          = cmDMX + 20;
  48.  
  49.     cmDMX_NextRow       = cmDMX + 21;
  50.     cmDMX_Up            = cmDMX + 22;
  51.     cmDMX_Down          = cmDMX + 23;
  52.     cmDMX_PgUp          = cmDMX + 24;
  53.     cmDMX_PgDn          = cmDMX + 25;
  54.     cmDMX_ScreenTop     = cmDMX + 26;
  55.     cmDMX_ScreenBottom  = cmDMX + 27;
  56.     cmDMX_Top           = cmDMX + 28;
  57.     cmDMX_Bottom        = cmDMX + 29;
  58.  
  59.  
  60.             {  +------------ 1 normal fields             }
  61.             {  | +---------- 2 normal selected field     }
  62.             {  | | +-------- 3 read-only selected field  }
  63.             {  | | | +------ 4 locked field              }
  64.             {  | | | | +---- 5 delimiter                 }
  65.             {  | | | | | +-- 6 border                    }
  66.             {  | | | | | |  }
  67.     cDMX  : string [6]  = #6#7#5#5#1#2;
  68.  
  69.  
  70.     accNormal    =    0;
  71.     accReadOnly  =    1;
  72.     accHidden    =    2;
  73.     accSkip      =    4;
  74.     accDelimiter =    8;
  75.  
  76.  
  77.     showTRUE     =   '■';  { TRUE indicator  }
  78.     showFALSE    =   ' ';  { FALSE indicator }
  79.     showOVERFLOW =   '*';  { overflow indicator for numbers }
  80.  
  81.  
  82.     fldSTR       =   'S';  { string field }
  83.     fldSTRNUM    =   '#';  { numeric string field }
  84.     fldCHAR      =   'C';  { character field }
  85.     fldCHARNUM   =   '0';  { numeric character field }
  86.     fldCHARVAL   =   'N';  { dbase formatted numeric field }
  87.     fldBYTE      =   'B';  { byte field }
  88.     fldSHORTINT  =   'J';  { shortint field }
  89.     fldWORD      =   'W';  { word field }
  90.     fldINTEGER   =   'I';  { integer field }
  91.     fldLONGINT   =   'L';  { longint field }
  92.     fldREALNUM   =   'R';  { real number field  (uses TREALNUM) }
  93.     fldBOOLEAN   =   'X';  { boolean value field }
  94.     fldHEXVALUE  =   'H';  { hexadecimal numeric entry }
  95.  
  96.     fldZEROMOD   =   'Z';  { zero modifier }
  97.  
  98.  
  99.   { Complex fields: }
  100.  
  101.     fldDATE      =  ' WW-'^F^Z + ^U+char(12) + ^P+char(2) +
  102.                      #0'ZW-'^Z + ^U+char(31) +
  103.                      #0'ZZZW '^Z^F + ^P+char(-6) +
  104.                      #0 + ^P+char(4);
  105.  
  106.     fldTIME      =  ' WW:'^F^Z + ^U+char(23) +
  107.                      #0'ZW '^Z + ^U+char(59) +
  108.                      #0'W'^F^H#0;  { seconds are hidden }
  109.  
  110.     fldDATETIME  =  ' WW-'^F^Z + ^U+char(12) + ^P+char(2) +
  111.                      #0'ZW-'^Z + ^U+char(31) +
  112.                      #0'ZZZW '^Z^F + ^P+char(-6) +
  113.                      '\' + ^P+char(4) +
  114.                       ' WW:'^F^Z + ^U+char(23) +
  115.                      #0'ZW:'^Z   + ^U+char(59) +
  116.                      #0'ZW '^Z^F + ^U+char(59);  { seconds are not hidden }
  117.  
  118.  
  119. type
  120.     pDMXfieldrec = ^tDMXfieldrec;
  121.     tDMXfieldrec =  RECORD    { these records describe each field for tvDMX }
  122.     Next,Prev    :  pDMXfieldrec;
  123.     access        :  byte;    { read-only, hidden, skip }
  124.     fieldnum    :  byte;    { 1..totalfields (0=none) }
  125.     screentab    :  integer;    { virtual column num. }
  126.     typecode    :  char;    { 's', 'r', etc. }
  127.     fillvalue    :  char;    { #0 or ' ' }
  128.     upperlimit    :  byte;    { maximum value limit }
  129.     showzeroes    :  boolean;    { display zero values }
  130.     truelen        :  byte;    { unformatted text length }
  131.     parenthesis    :  boolean;    { '('/')' characters }
  132.     decimals    :  byte;    { decimal point }
  133.     fieldsize    :  integer;    { sizeof (datatype) }
  134.     datatab        :  integer;    { position in record }
  135.     template    :  pstring;    { field template }
  136.     end;
  137.  
  138.  
  139.     showcodes    = (showanyway, shownegative, showregular);
  140.     showset      =  set of showcodes;    { used when displaying fields }
  141.  
  142.  
  143.   function  DmxStrLen (S : string)  : integer;
  144.     { returns the length of the visible portions of a tvDMX template string }
  145.  
  146.   function  FieldString (fieldrec  : pDMXfieldrec;
  147.              Show : showset;  var DataRec )  : string;
  148.     { returns a display string from a tvDMX field record }
  149.  
  150.  
  151. implementation
  152.  
  153.  
  154.   { ══════════════════════════════════════════════════════════════════════ }
  155.  
  156.  
  157. function  DmxStrLen (S : string)  : integer;
  158. var  i,Len,Ttl  : integer;
  159.      h          : boolean;
  160.  
  161.     procedure ResetDelimiter (D : boolean);
  162.     begin
  163.       If not h then Ttl := Ttl + Len;
  164.       If D then Inc (Ttl);
  165.       Len := 0;
  166.       h   := FALSE;
  167.     end;
  168.  
  169. begin
  170.   h   := FALSE;
  171.   Ttl := 0;
  172.   Len := 0;
  173.   i   := 0;
  174.   While (i < length (S)) do
  175.     begin
  176.     Inc (i);
  177.     Case S [i] of
  178.       '~':
  179.         begin
  180.         Inc (i);
  181.         While (S [i] <> '~') and (i < length (S)) do
  182.           begin
  183.           Inc (Len);
  184.           Inc (i);
  185.           end;
  186.         end;
  187.       ^P, ^U, ^V:  Inc (i);
  188.       ^H:          h := TRUE;
  189.       ^D:
  190.         begin
  191.         ResetDelimiter (TRUE);
  192.         Inc (i);
  193.         end;
  194.       #0,'\','|','│','║':
  195.         begin
  196.         ResetDelimiter (S [i] <> #0);
  197.         end;
  198.       ^A..^Z:  begin  end;
  199.      else      Inc (Len);
  200.       end;
  201.     end;
  202.   ResetDelimiter (FALSE);
  203.   DmxStrLen := Ttl;
  204. end;
  205.  
  206.  
  207.   { ══════════════════════════════════════════════════════════════════════ }
  208.  
  209.  
  210. function  FieldString (fieldrec    : pDMXfieldrec;
  211.                Show    : showset;  var DataRec )  : string;
  212. var  i,j,Len    :  integer;
  213.      C        :  char;
  214.      Numbers    :  boolean;
  215.      ItsBlank    :  boolean;
  216.      Q        :  boolean;
  217.      A,T    :  string;
  218.      R        :  TREALNUM;
  219.  
  220.      Data    :  pointer;
  221.      DataBool    :  pboolean  absolute Data;
  222.      DataByte    :  pbyte     absolute Data;
  223.      DataShort    :  pshortint absolute Data;
  224.      DataInt    :  pinteger  absolute Data;
  225.      DataWord    :  pword     absolute Data;
  226.      DataLong    :  plongint  absolute Data;
  227.      DataReal    :  PREALNUM  absolute Data;
  228.      DataStr    :  pstring   absolute Data;
  229.  
  230.     function  HexByte (Number : byte)  : string;
  231.     const bts  : array [0..15] of char = '0123456789ABCDEF';
  232.     begin
  233.       HexByte := bts [(Number shr 4) and $0F] + bts [Number and $0F]
  234.     end;
  235.  
  236.     function  BlankField  : boolean;
  237.     var  i : word;
  238.     begin
  239.       BlankField := TRUE;
  240.       If Len > 0 then
  241.         For i := 0 to pred (fieldrec^.fieldsize) do
  242.           If DataStr^ [i] <> #0 then BlankField := FALSE;
  243.     end;
  244.  
  245.     function  CheckBlank (Zero : boolean) :  boolean;
  246.     begin
  247.       If (Zero) and not ((fieldrec^.showzeroes) or (showanyway in Show)) then
  248.         begin
  249.         fillchar (A [1], Len, ' ');
  250.         A [0]      := chr (Len);
  251.         ItsBlank   := TRUE;
  252.         CheckBlank := TRUE;
  253.         end
  254.        else
  255.         CheckBlank := FALSE;
  256.     end;
  257.  
  258.     procedure FormNum (sign : boolean);
  259.     { length of A[] must equal Len + 1 }
  260.     var  i,j : integer;
  261.          cc  : char;
  262.     begin
  263.       With fieldrec^ do
  264.         begin
  265.         If sign and (shownegative in Show) then
  266.           begin
  267.           i := 1;
  268.           While (A [i] = ' ') do Inc (i);
  269.           If (i > 1) then A [pred (i)] := '-';
  270.           end;
  271.         If (parenthesis) then
  272.           begin
  273.           If sign then
  274.             begin
  275.             T [pos ('(', T)] := ' ';
  276.             T [pos (')', T)] := ' ';
  277.             end
  278.            else
  279.             begin
  280.             A [pos ('-', A)] := ' ';
  281.             If length (A) > succ (Len) then Delete (A, 1,1);
  282.             end;
  283.           end;
  284.         If (A [1] <> ' ') then
  285.           begin
  286.           fillchar (A [1], Len, showOVERFLOW);
  287.           A [0] := chr (Len);
  288.           end
  289.          else
  290.           begin
  291.           Delete (A, 1,1);
  292.           Numbers := TRUE;
  293.           end;
  294.         end;
  295.     end;
  296.  
  297.  
  298. begin
  299.   With fieldrec^ do
  300.     begin
  301.     If (fieldrec = nil) or (access and accHidden <> 0) then
  302.       begin
  303.       FieldString := '';
  304.       Exit;
  305.       end;
  306.     If (template = nil) or (length (template^) = 0) then
  307.       begin
  308.       If typecode <> #0 then FieldString := typecode else FieldString := '';
  309.       Exit;
  310.       end;
  311.     T    := template^;
  312.     If (fieldsize = 0) then
  313.       begin
  314.       FieldString := T;
  315.       Exit;
  316.       end;
  317.     Data := ptr (seg (DataRec), ofs (DataRec) + datatab);
  318.     Len  := truelen;
  319.     Numbers  := FALSE;
  320.     ItsBlank := FALSE;
  321.     Q    := FALSE;
  322.     C    := upcase (typecode);
  323.     Case C of
  324.  
  325.       fldSTR, fldSTRNUM :              { 'S'/'#' }
  326.         begin
  327.         If DataStr^ <> '' then
  328.           For i := 1 to length (DataStr^) do
  329.             If ord (DataStr^[i]) and $DF <> 0 then Q := TRUE;
  330.         If not CheckBlank (not Q) then
  331.           begin
  332.           fillchar (A [1], Len, ' ');
  333.           Move (DataStr^[1], A [1], length (DataStr^));
  334.           A [0] := chr (Len);
  335.           end;
  336.         end;
  337.  
  338.       fldCHAR, fldCHARNUM :            { 'C'/'0' }
  339.         begin
  340.         If Len > 0 then
  341.           For i := 0 to pred (Len) do
  342.             If ((ord (DataStr^[i]) and $DF) <> 0) then Q := TRUE;
  343.         If not CheckBlank (not Q) then
  344.           begin
  345.           Move (Data^, A [1], Len);
  346.           A [0] := chr (Len);
  347.           end;
  348.         end;
  349.  
  350.       fldCHARVAL :                     { 'N' }
  351.         begin
  352.         A [0] := chr (fieldsize);
  353.         Move (Data^, A [1], fieldsize);
  354.         Val (A, R, i);
  355.         If i <> 0 then R := 0.0;
  356.         If not CheckBlank (R = 0.0) then
  357.           begin
  358.           If decimals > 0 then
  359.             begin
  360.             Str (R:(Len + 2):decimals, A);
  361.             Delete (A, (Len + 2) - decimals, 1);
  362.             end
  363.            else
  364.             Str (R:(Len + 1):0, A);
  365.           FormNum (R >= 0);
  366.           end;
  367.         end;
  368.  
  369.       fldBYTE :                        { 'B' }
  370.         If not CheckBlank (DataByte^ = 0) then
  371.           begin
  372.           Str (DataByte^:(Len + 1), A);
  373.           FormNum (TRUE);
  374.           end;
  375.  
  376.       fldSHORTINT :                    { 'J' }
  377.         If not CheckBlank (DataShort^ = 0) then
  378.           begin
  379.           Str (DataShort^:(Len + 1), A);
  380.           FormNum (DataShort^ >= 0);
  381.           end;
  382.  
  383.       fldWORD :                        { 'W' }
  384.         If not CheckBlank (DataWord^ = 0) then
  385.           begin
  386.           Str (DataWord^:(Len + 1), A);
  387.           FormNum (TRUE);
  388.           end;
  389.  
  390.       fldINTEGER :                     { 'I' }
  391.         If not CheckBlank (DataInt^ = 0) then
  392.           begin
  393.           Str (DataInt^:(Len + 1), A);
  394.           FormNum (DataInt^ >= 0);
  395.           end;
  396.  
  397.       fldLONGINT :                     { 'L' }
  398.         If not CheckBlank (DataLong^ = 0) then
  399.           begin
  400.           Str (DataLong^:(Len + 1), A);
  401.           FormNum (DataLong^ >= 0);
  402.           end;
  403.  
  404.       fldREALNUM :                       { 'R' }
  405.         If not CheckBlank (DataReal^ = 0.0) then
  406.           begin
  407.           If decimals > 0 then
  408.             begin
  409.             Str (DataReal^:(Len + 2):decimals, A);
  410.             Delete (A, (Len + 2) - decimals, 1);
  411.             end
  412.            else
  413.             Str (DataReal^:(Len + 1):0, A);
  414.           If (abs (DataReal^) > 1e35) then
  415.             begin
  416.             A := '**********************************';
  417.             If (DataReal^ < 0.0) then A [1] := '-';
  418.             end;
  419.           FormNum (DataReal^ >= 0);
  420.           end;
  421.  
  422.       fldBOOLEAN :                     { 'X' }
  423.         begin
  424.         If (Len = 0) then
  425.           begin
  426.           If DataBool^ then A := '' else ItsBlank := TRUE;
  427.           end
  428.          else
  429.           begin
  430.           If not CheckBlank (not DataBool^) then
  431.             begin
  432.             If DataBool^ then
  433.               fillchar (A [1], Len, showTRUE)
  434.              else
  435.               fillchar (A [1], Len, showFALSE);
  436.             A [0] := chr (Len);
  437.             end;
  438.           end;
  439.         end;
  440.  
  441.       fldHEXVALUE :                    { 'H' }
  442.         If not CheckBlank (BlankField) then
  443.           begin
  444.           A  := '';
  445.           For i := 0 to pred (fieldsize) do A := hexbyte (ord (DataStr^ [i])) + A;
  446.           If (length (A) > Len) then Delete (A, 1,1);
  447.           end;
  448.  
  449.      else
  450.         begin
  451.        { possible virtual method for future expansion }
  452.         end;
  453.  
  454.       end;  { case of C }
  455.  
  456.     If ItsBlank then
  457.       begin
  458.       fillchar (T [1], length (T), ' ');
  459.       end
  460.      else
  461.       If A <> '' then
  462.         begin
  463.         j  := length (A);
  464.         For i := length (T) downto 1 do
  465.           begin
  466.           If ord (T [i]) and $FE = 0 then
  467.             begin
  468.             If j > 0 then
  469.               begin
  470.               If (T [i] = #0) or (A [j] > ' ') then
  471.                 T [i] := A [j]
  472.                else
  473.                 T [i] := '0';
  474.               Dec (j);
  475.               end;
  476.             end
  477.            else
  478.             If Numbers and (T [i] = ',') then
  479.               begin
  480.               If (j <= 0) then T [i] := ' '
  481.                else
  482.                 begin
  483.                 If (A [j] in [' ','-']) then
  484.                   begin
  485.                   T [i] := A [j];
  486.                   Dec (j);
  487.                   end;
  488.                 end;
  489.               end;
  490.           end;
  491.         end;
  492.     end;
  493.  
  494.   FieldString := T;
  495.  
  496. end;  { FieldString() }
  497.  
  498.  
  499.   { ══════════════════════════════════════════════════════════════════════ }
  500.  
  501.  
  502.  
  503. End.
  504.